package com.kifas.controller;

import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.kifas.entity.BarangEntity;
import com.kifas.entity.GudangEntity;
import com.kifas.entity.JenisBarangEntity;
import com.kifas.entity.StokOpnameEntity;
import com.kifas.model.helper.StokChartHelper;
import com.kifas.model.xml.BarangModel;
import com.kifas.model.xml.GudangModel;
import com.kifas.model.xml.JenisBarangModel;
import com.kifas.model.xml.PersistStatus;
import com.kifas.model.xml.SatuanModel;
import com.kifas.model.xml.StokOpnameModel;
import com.kifas.service.EntityServiceManager;

/**
 * Created by IntelliJ IDEA. User: brainmaster Date: 4/28/11 Time: 1:20 AM
 */

@Component
@Scope("prototype")
@Path("/StokOpname")
public class StokOpnameController {

	@Context
	UriInfo uriInfo;

	@Autowired
	private EntityServiceManager entityManager;

	@GET
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getTodayStok() {
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnames();
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Json")
	@Produces(MediaType.TEXT_PLAIN)
	public String getTodayStokJson() {
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnames();
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		List<StokChartHelper> stokOpnameModelsR = new ArrayList<StokChartHelper>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}

		for (StokOpnameModel s : stokOpnameModels) {
			boolean isFind = false;
			if (stokOpnameModelsR.isEmpty()) {
				stokOpnameModelsR.add(new StokChartHelper(s.getQty().longValue(), s.getBarang().getKdBarang(), s.getBarang().getNamaBarang()));
				continue;
			}
			for (int x = 0; x < stokOpnameModelsR.size(); x++) {
				System.out
						.println(" # : " + x + ": " + stokOpnameModelsR.size() + " : " + s.getBarang().getKdBarang() + stokOpnameModelsR.get(x).getKdBarang());
				if (s.getBarang().getKdBarang().equals(stokOpnameModelsR.get(x).getKdBarang())) {
					StokChartHelper sc = stokOpnameModelsR.get(x);
					sc.setQty(sc.getQty().longValue() + s.getQty().longValue());
					stokOpnameModelsR.set(x, sc);
					isFind = true;
				}
			}
			if (!isFind) stokOpnameModelsR.add(new StokChartHelper(s.getQty().longValue(), s.getBarang().getKdBarang(), s.getBarang().getNamaBarang()));
		}
		Gson gson = new Gson();
		String s = gson.toJson(stokOpnameModelsR).toString();
		return s;
	}

	@GET
	@Path("Barang/{id}")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getStokOpnames(@PathParam("id") Long idBarang) {
		BarangEntity barangEntity = entityManager.getBarang(idBarang);
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnameByBarang(barangEntity);
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Gudang/{id}")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getStokOpnamesByGudang(@PathParam("id") Long idGudang) {
		GudangEntity gudangEntity = entityManager.getGudang(idGudang);
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnameByGudang(gudangEntity);
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Available/Barang/{id}")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getAvailableStokOpnames(@PathParam("id") Long idBarang) {
		BarangEntity barangEntity = entityManager.getBarang(idBarang);
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnameAvailable(barangEntity);
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Available/Gudang/{id}")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getAvailableStokOpnamesGudang(@PathParam("id") Long idGudang) {
		GudangEntity gudangEntity = entityManager.getGudang(idGudang);
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnameAvailable(gudangEntity);
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Available")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getAvailableStokOpnames() {
		List<StokOpnameEntity> stokOpnames = entityManager.getStokOpnameAvailable();
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : stokOpnames) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Barang/Expired/{id}")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getExpiredStok(@PathParam("id") Long idBarang) {
		BarangEntity barangEntity = entityManager.getBarang(idBarang);
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : entityManager.getExpiredStokByBarang(barangEntity)) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Expired")
	@Produces(MediaType.TEXT_XML)
	public List<StokOpnameModel> getExpiredStok() {
		List<StokOpnameModel> stokOpnameModels = new ArrayList<StokOpnameModel>();
		for (StokOpnameEntity stokOpnameEntity : entityManager.getExpiredStok()) {
			stokOpnameModels.add(castToStokOpnameModel(stokOpnameEntity));
		}
		return stokOpnameModels;
	}

	@GET
	@Path("Populate")
	@Produces(MediaType.TEXT_XML)
	public PersistStatus populateStokOpnameManually() {
		try {
			entityManager.populateTodayStok();
		} catch (Exception e) {
			new PersistStatus("StokOpnameEntity", "failed", "transaction rollback");
		}
		return new PersistStatus("StokOpnameEntity", "success");
	}

	protected StokOpnameModel castToStokOpnameModel(StokOpnameEntity stokOpnameEntity) {
		BarangEntity barangEntity = stokOpnameEntity.getBarang();
		GudangEntity gudangEntity = stokOpnameEntity.getGudang();
		GudangModel gudangModel = new GudangModel(gudangEntity.getIdGudang(), gudangEntity.getNamaGudang(), gudangEntity.getLokasi(),
				gudangEntity.getKapasitas(), gudangEntity.getPetugas(), gudangEntity.getAlamat(), gudangEntity.getKode(), gudangEntity.getNotelp(),
				gudangEntity.getTgl_jth_tempo(), gudangEntity.getCreatedBy());
		JenisBarangEntity jenisBarangEntity = barangEntity.getJenisBarang();
		JenisBarangModel jenisBarangModel = new JenisBarangModel(jenisBarangEntity.getIdJenisBarang(), jenisBarangEntity.getJenis(), jenisBarangEntity.getCreatedBy());
		SatuanModel satuanModel = new SatuanModel(barangEntity.getSatuan().getIdSatuan(), barangEntity.getSatuan().getSatuan(), barangEntity.getCreatedBy());
		BarangModel barangModel = new BarangModel(barangEntity.getIdBarang(), barangEntity.getKdBarang(), jenisBarangModel, satuanModel,
				barangEntity.getNama(), barangEntity.getHargaBeli(), barangEntity.getHargaJual(), barangEntity.getCreatedBy());
		return new StokOpnameModel(stokOpnameEntity.getIdStok(), barangModel, gudangModel, stokOpnameEntity.getBulanKadaluarsa(), stokOpnameEntity.getQty(),
				stokOpnameEntity.getQtyLama(), stokOpnameEntity.getQtyBeli(), stokOpnameEntity.getQtyJual(), stokOpnameEntity.getTanggal());
	}

	protected void persistStokOpname(String noStokOpname, String idBarang, String idSatuan, String idGudang, String bulanKadaluarsa, Integer qty) {
		StokOpnameEntity stokOpname = new StokOpnameEntity();
		stokOpname.setIdStok(null);
		BarangEntity barang = entityManager.getBarang(Long.valueOf(idBarang));
		GudangEntity gudang = entityManager.getGudang(Long.valueOf(idGudang));
		stokOpname.setBarang(barang);
		stokOpname.setGudang(gudang);
	}
}
